home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cdity / ModeProSrc.lha / Daemon / OldPatch / MPPatch.cworkdn < prev    next >
Text File  |  1996-11-20  |  30KB  |  1,186 lines

  1. #include "MP.h"
  2. #include <graphics/videocontrol.h>
  3. #include <graphics/displayinfo.h>
  4. #include <debug.h>
  5.  
  6. //ULONG Colors[]={1<<16|0,~0,0,0,0};
  7.  
  8. #define HAM_EHB_DP_KEY (HAM_KEY | 0x400 | EXTRAHALFBRITE_KEY)
  9. //                                DualPF
  10.  
  11. #define ADD_DEBUG_CODE
  12.  
  13. /* kprintf
  14.  
  15. #ifdef ADD_DEBUG_CODE
  16.       if(MPSem->Debug)
  17.       {
  18.       }
  19. #endif
  20.  
  21. */
  22.  
  23. #ifdef ADD_DEBUG_CODE
  24. void    PrintTags(struct TagItem *tags);
  25. UBYTE  *FindTagSting(ULONG id);
  26. void    PrintDefNode(struct DefaultNode *DN);
  27. #endif
  28.  
  29. #define AllocOpenNode(on)  (on ? on: AllocMem(sizeof(struct OpenNode),MEMF_CLEAR|MEMF_PUBLIC))
  30.   
  31. void CatchDNode(ULONG Dest, UBYTE *Name, struct DefaultNode *SrcNode);
  32. void CloneTextAttr(struct TTextAttr *Source, struct TTextAttr *Dest);
  33.  
  34. extern ULONG CenterAll;
  35. extern struct MPSem     *MPSem;
  36. extern CxObj  *Broker;
  37. extern struct MsgPort   *BrokerPort;
  38. extern BOOL   V39;
  39. extern BYTE   PublicSignal;
  40. extern struct Process   *MPTask;
  41. extern struct MsgPort   *CatchPort;
  42. extern struct Screen ASM *(*OldOpenScreen)(REG __a0 struct NewScreen *,REG __a6 struct IntuitionBase *);
  43. extern struct Screen ASM *(*OldOpenScreenTagList)(REG __a0 struct ExtNewScreen *ns,
  44.                                                   REG __a1 struct TagItem *taglist,
  45.                                                   REG __a6 struct IntuitionBase * );
  46. extern BOOL ASM (*OldCloseScreen)   (REG __a0 struct Screen *,REG __a6 struct IntuitionBase *);
  47.  
  48. extern LONG ASM (*OldCloseWorkBench)(REG __a6 struct IntuitionBase *lib);
  49.  
  50. /*********************************************************************************/
  51.  
  52. UBYTE *Topaz="topaz.font";
  53.  
  54. struct Screen ASM __saveds  *NewOpenScreen(REG __a0 struct ExtNewScreen *ns,
  55.                                            REG __a6 struct IntuitionBase *IBase)
  56. {
  57.   return(NewOpenScreenTagList(ns,(ns->Type & NS_EXTENDED ?ns->Extension:0),IBase ));
  58. }
  59.  
  60. /*************************************************************************************/
  61.  
  62. struct Screen ASM __saveds  *NewOpenScreenTagList(REG __a0 struct ExtNewScreen *ns,
  63.                                                   REG __a1 struct TagItem *TagList,
  64.                                                   REG __a6 struct IntuitionBase *IBase)
  65. {
  66.   struct OpenNode *ON;
  67.   struct BitMap *bitmap;
  68.   struct Rectangle odclip;
  69.   struct DefaultNode *n;
  70.   struct DefaultNode workdn={0},
  71.                      centeralldn={0};
  72.   UBYTE  *title;
  73.   LONG   custombm,wbscr;
  74.   BOOL   changed,modechanged;
  75.   WORD   pens[]={~0},
  76.          *screenpens,
  77.          dripens[DRIPENS+1];         
  78.   ULONG  tagnum,ehbham;
  79.  
  80.   struct Screen *scr;
  81.   struct DimensionInfo diminfo;
  82.   struct DisplayInfo   dispinfo;
  83.   
  84.   struct ScreenModeRequester *sr;
  85.   
  86.   struct ColorSpec Colors4[257];
  87.   ULONG  Colors32[256*3+2];
  88.   
  89.   struct Task *task;
  90.   UBYTE  cli_name[41],*taskname;
  91.  
  92.   struct TagItem ti[23],
  93.                 *tag;
  94.  
  95.   struct TextAttr *storedfont=0;
  96.   struct TextFont *textfont=0;
  97.   struct TagItem fonttags[]=
  98.   {
  99.     TA_DeviceDPI,(1<<16) | 1,TAG_DONE,0
  100.   };
  101.  
  102.  
  103.   ObtainSemaphoreShared(&MPSem->ListSem); 
  104.   ObtainSemaphore(&MPSem->NodeSem); 
  105.   
  106. #ifdef ADD_DEBUG_CODE
  107.   if(MPSem->Debug)
  108.   {
  109.     kprintf("\n---------------%s-----------------\nOpenScreenX()\n",ns,FindTask(0)->tc_Node.ln_Name);
  110.     kprintf("  IntuitionBase=%8lx\n",IBase);
  111.     if(ns)
  112.     {
  113.       kprintf("  struct NewScreen %8lx\n",ns);
  114.       kprintf("    LeftEdge=%7ld TopEdge=%7ld\n    Width=%7ld    Height=%7ld\n    Depth=%7ld\n   dpen=%7ld     bpen=%7ld\n   vm=%8lx      type=%ld\n    font=%8lx\n",
  115.         ns->LeftEdge, ns->TopEdge, ns->Width, ns->Height, ns->Depth,
  116.         ns->DetailPen, ns->BlockPen, ns->ViewModes, ns->Type, ns->Font);
  117.       if(ns->DefaultTitle)
  118.         kprintf("    defaulttitle=%s\n", ns->DefaultTitle);
  119.       kprintf("    gadgets=%8lx  bitmap=%8lx\n",
  120.         ns->Gadgets, ns->CustomBitMap);
  121.       if(ns->Type & NS_EXTENDED)
  122.         kprintf("    * is NS_EXTENDED\n");
  123.     }  
  124.     if(TagList)
  125.     {
  126.       kprintf("  TagList\n");
  127.       PrintTags(TagList);
  128.     }
  129.     kprintf("..................................\n");
  130.   }
  131. #endif
  132.   
  133.   /* Now that we've got the semaphore all globals are mine */
  134.   /* initialize everything */
  135.  
  136.   tagnum=0;
  137.  
  138.   title=NULL;
  139.  
  140.   ON=NULL;   //likewb=0;
  141.   
  142.   custombm=changed=modechanged=workdn.Look3D=workdn.OverscanType=workdn.Flags=0;
  143.   workdn.Depth  =1;
  144.   
  145.   wbscr=0;  
  146.   workdn.Flags=0;
  147.   
  148.   workdn.Width= workdn.Height= workdn.AutoScroll= workdn.ModeID= -1;
  149.  
  150.   workdn.Pens[0]=~0;
  151.   screenpens=workdn.Pens;
  152.   
  153.   task=FindTask(0);
  154.   taskname=task->tc_Node.ln_Name;
  155.  
  156.   if(GetProgramName(cli_name,40)) /* Get cli program's name */
  157.     if(cli_name[0]!=0)            /* make sure cli_name contains something */
  158.       taskname=cli_name;
  159.   
  160.   /* Initialization Done */
  161.  
  162.   /**** Extract screen info from ns and TagList ****/  
  163.   if(ns)                     
  164.   {
  165.     storedfont      =ns->Font;
  166.     workdn.Width    =ns->Width;
  167.     workdn.Height   =ns->Height;
  168.     workdn.ModeID   =ns->ViewModes;
  169.     workdn.Depth    =ns->Depth;
  170.     title           =ns->DefaultTitle;
  171.     custombm        =ns->Type & CUSTOMBITMAP;
  172.     wbscr           =(ns->Type & SCREENTYPE)==WBENCHSCREEN;
  173.   }
  174.  
  175.   if(TagList)
  176.   {
  177.     custombm            =GetTagData(SA_BitMap           ,custombm               ,TagList);
  178.     workdn.Width        =GetTagData(SA_Width            ,workdn.Width           ,TagList);
  179.     workdn.Height       =GetTagData(SA_Height           ,workdn.Height          ,TagList);
  180.     workdn.AutoScroll   =GetTagData(SA_AutoScroll       ,workdn.AutoScroll      ,TagList);
  181.     workdn.OverscanType =GetTagData(SA_Overscan         ,workdn.OverscanType    ,TagList);
  182.     workdn.ModeID       =GetTagData(SA_DisplayID        ,workdn.ModeID          ,TagList);
  183.     workdn.Depth        =GetTagData(SA_Depth            ,workdn.Depth           ,TagList);
  184.     workdn.Flags       =(GetTagData(SA_Interleaved      ,workdn.Flags & INTERLEAVE,TagList) ? INTERLEAVE : 0);
  185.     title      =(UBYTE *)GetTagData(SA_Title            ,(ULONG)title           ,TagList);
  186.     wbscr              =(GetTagData(SA_Type             ,wbscr                  ,TagList) & SCREENTYPE)==WBENCHSCREEN;
  187.  
  188.     if(tag=FindTagItem(SA_Overscan,TagList))
  189.       if(!FindTagItem(SA_DClip,TagList))
  190.         workdn.OverscanType=tag->ti_Data;
  191.     if(tag=FindTagItem(SA_Pens,TagList))
  192.     {
  193.       LONG pcounter=0;
  194.       
  195.       screenpens=(UWORD *)(tag->ti_Data);
  196.       if(screenpens)
  197.       {
  198.         for(pcounter=0;pcounter<DRIPENS && screenpens[pcounter]!=~0;pcounter++)
  199.           workdn.Pens[pcounter]=screenpens[pcounter];
  200.       }
  201. /************************************************************************************/
  202. //      workdn.Pens[pcounter]=~0;
  203.     }
  204.   }
  205.  
  206.   n=NULL;
  207.  
  208.   ehbham=0;
  209.  
  210.   if(GetDisplayInfoData(0, (UBYTE *)&dispinfo, sizeof(dispinfo), DTAG_DISP, workdn.ModeID))
  211.     ehbham=dispinfo.PropertyFlags & (DIPF_IS_DUALPF | DIPF_IS_HAM | 
  212.                                      DIPF_IS_PF2PRI | DIPF_IS_EXTRAHALFBRITE);
  213.   
  214. #ifdef ADD_DEBUG_CODE
  215.   if(MPSem->Debug)
  216.   {
  217.     kprintf("..................................\n");
  218.     kprintf("\n    wbscr=%lx\n",wbscr);
  219.     kprintf("..................................\n");
  220.   }
  221. #endif
  222.   
  223.   if(!title) title=GetString(MSG_ITEM_NO_NAME); /* Just in case ther isn't a title */
  224.  
  225.   if(!(n=FindDNode(&MPSem->PromotionList[1],title)))
  226.   {
  227.     if(!(n=FindDNode(&MPSem->PromotionList[0],taskname)))
  228.     { 
  229.       struct DefaultNode *smnode;
  230.       BOOL   smgo=TRUE;
  231.       ULONG  mode_monall,orig_monall;
  232.       
  233.       //modenorm    =workdn.ModeID;// & ~HAM_EHB_DP_KEY;
  234.       mode_monall  =workdn.ModeID | ALL_MODES;
  235.       
  236.       smnode=(struct DefaultNode *)MPSem->PromotionList[PL_SCREENMODES].lh_Head;
  237.       while(smnode->Def_Node.ln_Succ && smgo)
  238.       {
  239.         orig_monall =smnode->OrigDisplayID & ALL_MODES;
  240.       
  241.         if( (smnode->OrigDisplayID == workdn.ModeID) ||
  242.             (smnode->OrigDisplayID == mode_monall) )     
  243.         {
  244.           n=smnode;
  245.           smgo=FALSE;
  246.         }
  247.         smnode=(struct DefaultNode *)smnode->Def_Node.ln_Succ;
  248.       }
  249.       if(MPSem->CatchPrograms && taskname)   //Catch new names only.
  250.         CatchDNode(0,taskname,&workdn);
  251.       if(MPSem->CatchScreens) 
  252.         CatchDNode(1,title,&workdn);
  253.     }
  254.   }
  255.   
  256. #ifdef ADD_DEBUG_CODE
  257.   if(MPSem->Debug)
  258.   {
  259.     if(n)
  260.       PrintDefNode(n);
  261.     kprintf("..................................\n");
  262.   }
  263. #endif
  264.  
  265.   if(!n && MPSem->CenterAll)
  266.   {
  267.     n=¢eralldn;
  268.     centeralldn.CenterFlags=MPSem->CenterAll;
  269.   } 
  270.  
  271.   if(!MPSem->Enabled || !n)
  272.   {
  273.     scr=OldOpenScreenTagList(ns,TagList,IBase);
  274.     ReleaseSemaphore(&MPSem->ListSem);
  275.     ReleaseSemaphore(&MPSem->NodeSem);
  276.     return(scr);
  277.   }
  278.   
  279.   workdn.Look3D     =n->Look3D;
  280.   workdn.Flags     |=( n->Flags & INTERLEAVE );
  281.   screenpens        =n->Pens;
  282.  
  283.   if(!wbscr)
  284.   {
  285.     switch(n->ModeSelect)
  286.     {
  287.       case 1:
  288. #ifdef ADD_DEBUG_CODE
  289.       if(MPSem->Debug)
  290.       {
  291.         kprintf("Promoting Monitor\n");
  292.         kprintf("..................................\n");
  293.       }
  294. #endif  
  295.         if(workdn.ModeID > -1)
  296.         {
  297.           if(V39)
  298.           {
  299.             workdn.ModeID=BestModeID(BIDTAG_SourceID,workdn.ModeID,
  300.                               BIDTAG_MonitorID      ,n->ModeID & MONITOR_ID_MASK,
  301.                               BIDTAG_Depth          ,workdn.Depth,
  302.                               BIDTAG_DIPFMustHave   ,ehbham,
  303.                               TAG_SKIP              ,(workdn.Width==-1 ? 1:0),
  304.                               BIDTAG_DesiredWidth   ,workdn.Width,
  305.                               TAG_SKIP              ,(workdn.Height==-1 ? 1:0),
  306.                               BIDTAG_DesiredHeight  ,workdn.Height,
  307.                               TAG_DONE);
  308.           }
  309.           else
  310.           {
  311.             workdn.ModeID= (n->ModeID & MONITOR_ID_MASK) | (workdn.ModeID & (~MONITOR_ID_MASK));
  312.           }
  313.           if(workdn.ModeID==INVALID_ID) 
  314.              workdn.ModeID=n->ModeID;
  315.               
  316.           modechanged=TRUE;
  317.         }
  318.       case 0:          
  319.         workdn.AutoScroll  =n->AutoScroll;
  320.         break;
  321.       case 2:
  322. #ifdef ADD_DEBUG_CODE
  323.       if(MPSem->Debug)
  324.       {
  325.         kprintf("Promoting ScreenMode\n");
  326.         kprintf("..................................\n");
  327.       }
  328. #endif  
  329.         workdn.ModeID       =n->ModeID;
  330.         workdn.OverscanType =n->OverscanType;
  331.         workdn.Width        =n->Width;
  332.         workdn.Height       =n->Height;
  333.         workdn.AutoScroll   =n->AutoScroll;
  334.         workdn.Depth        =n->Depth;
  335.         workdn.Flags        |=n->Flags & n->Depth;
  336.         changed=TRUE;
  337.         break;
  338.       case 3:
  339. #ifdef ADD_DEBUG_CODE
  340.       if(MPSem->Debug)
  341.       {
  342.         kprintf("Promoting with Requester\n");
  343.         kprintf("..................................\n");
  344.       }
  345. #endif  
  346.         if((sr=(struct ScreenModeRequester *)AllocAslRequestTags(ASL_ScreenModeRequest,
  347.                     ASLSM_TitleText             ,title,
  348.                     ASLSM_DoWidth               ,TRUE ,
  349.                     ASLSM_DoHeight              ,TRUE ,
  350.                     ASLSM_DoOverscanType        ,TRUE ,
  351.                     ASLSM_DoAutoScroll          ,TRUE ,
  352.                     ASLSM_DoDepth               ,n->Flags & DEPTH,
  353.                     ASLSM_InitialAutoScroll     ,n->AutoScroll,
  354.                     ASLSM_InitialDisplayWidth   ,n->Width,
  355.                     ASLSM_InitialDisplayHeight  ,n->Height,
  356.                     ASLSM_InitialDisplayID      ,n->ModeID,
  357.                     ASLSM_InitialDisplayDepth   ,n->Depth,
  358.                     ASLSM_NegativeText          ,GetString(MSG_REQ_USE_DEFAULT),
  359.                     ASLSM_PropertyFlags         ,0,
  360.                     ASLSM_PropertyMask          ,BADMODES,                      
  361.                     TAG_END 
  362.                     )))
  363.         {
  364.           if(AslRequest(sr,NULL))
  365.           {
  366.             workdn.ModeID    =sr->sm_DisplayID | ehbham;
  367.             workdn.OverscanType  =sr->sm_OverscanType;
  368.             workdn.Width     =sr->sm_DisplayWidth;
  369.             workdn.Height    =sr->sm_DisplayHeight;    
  370.             changed   =TRUE;
  371.             workdn.Depth  =sr->sm_DisplayDepth;
  372.             workdn.Flags  |=n->Flags & DEPTH;
  373.           }
  374.           FreeAslRequest(sr);  
  375.         }
  376.         break; 
  377.     }/* end switch*/
  378.   
  379.     /**** Setup promoted taglist ****/
  380.      
  381.     if( (n->Flags & DNF_FORCEPLANAR)  && 
  382.         (workdn.Width  > 0)           && 
  383.         (workdn.Height > 0)           &&
  384.         (!custombm)                   &&
  385.         (V39)                         &&
  386.         (workdn.Depth  > 0)  )
  387.     {
  388.  
  389.       if(bitmap=AllocBitMap(workdn.Width,workdn.Height,workdn.Depth,BMF_CLEAR|BMF_DISPLAYABLE,0))
  390.       {
  391.         if(ON=AllocOpenNode(ON))
  392.         {
  393.           ON->Flags|=ON_BITMAP;
  394.         
  395.           ON->BitMap=bitmap;
  396.           ti[tagnum].ti_Tag=SA_BitMap;
  397.           ti[tagnum].ti_Data=(ULONG)bitmap;
  398.           tagnum++;
  399.         }
  400.         else
  401.           FreeBitMap(bitmap);
  402.       }
  403. #ifdef ADD_DEBUG_CODE
  404.       if(MPSem->Debug)
  405.       {
  406.         kprintf("  Force Planar: Bitmap %8lx\n",bitmap);
  407.       }
  408. #endif
  409.     }
  410.     
  411.   
  412.     if(changed && !(custombm))
  413.     {
  414.       if(workdn.Width!=0)
  415.       {
  416.         ti[tagnum].ti_Tag=SA_Width;
  417.         ti[tagnum].ti_Data=workdn.Width;
  418.         tagnum++;
  419.       }
  420.       if(workdn.Height!=0)
  421.       {
  422.         ti[tagnum].ti_Tag=SA_Height;
  423.         ti[tagnum].ti_Data=workdn.Height;
  424.         tagnum++;
  425.       }
  426.       
  427.       if(FindTagItem(SA_DClip,TagList))
  428.       { // if it specifies a dclip, i need to override it.
  429.         if(QueryOverscan(workdn.ModeID,&odclip,workdn.OverscanType))
  430.         {
  431.           ti[tagnum].ti_Tag=SA_DClip;
  432.           ti[tagnum].ti_Data=(ULONG)&odclip;
  433.           tagnum++;
  434.         }
  435.       }
  436.       else
  437.       {
  438.         ti[tagnum].ti_Tag=SA_Overscan;
  439.         ti[tagnum].ti_Data=workdn.OverscanType;
  440.         tagnum++;
  441.       }
  442.     }
  443.   
  444.     if(modechanged || changed)
  445.     {
  446.       ti[tagnum].ti_Tag=SA_DisplayID;
  447.       ti[tagnum].ti_Data=workdn.ModeID;
  448.       tagnum++;
  449.     }
  450.  
  451.     if(n->Flags & SHAREPENS)
  452.     {
  453.       ti[tagnum].ti_Tag=SA_SharePens;
  454.       ti[tagnum].ti_Data=TRUE;
  455.       tagnum++;
  456.     }
  457.  
  458.     if((workdn.Flags & DEPTH) && !(custombm) && !(ehbham))
  459.     {
  460.       ti[tagnum].ti_Tag=SA_Depth;
  461.       ti[tagnum].ti_Data=workdn.Depth;
  462.       tagnum++;
  463.     }
  464.     
  465.     if((n->Flags & DNF_PALETTE) && n->Palette && n->Colors)
  466.     {
  467.       if(V39)
  468.       {    
  469.         Colors32[0]=n->Colors<<16;
  470.         CopyMemQuick(n->Palette,&Colors32[1],n->Colors*3*sizeof(ULONG));
  471.         Colors32[n->Colors*3+2]=0;
  472.         
  473.         ti[tagnum].ti_Tag=SA_Colors32;
  474.         ti[tagnum].ti_Data=(ULONG)Colors32;
  475.         tagnum++;
  476.       }
  477.       else
  478.       {
  479.         ULONG c;
  480.   
  481.         for(c=0;c<n->Colors;c++)
  482.         {
  483.           Colors4[c].ColorIndex=c;
  484.           Colors4[c].Red   =n->Palette[c].Red>>28;
  485.           Colors4[c].Green =n->Palette[c].Green>>28;
  486.           Colors4[c].Blue  =n->Palette[c].Blue>>28;
  487.         }
  488.         Colors4[c].ColorIndex=-1;
  489.         
  490.         ti[tagnum].ti_Tag=SA_Colors; 
  491.         ti[tagnum].ti_Data=(ULONG)Colors4;
  492.         tagnum++;
  493.       }
  494.     }
  495.  
  496.     switch(n->FontType)
  497.     {
  498.       case SFONT_SYS:
  499.         if(ns) ns->Font=0;
  500.         ti[tagnum].ti_Tag=SA_SysFont;
  501.         ti[tagnum].ti_Data=1;
  502.         tagnum++;
  503.         break;
  504.       case SFONT_MP:
  505.         if(n->Font.tta_Name)
  506.         {
  507.           if(ON=AllocOpenNode(ON))
  508.           {
  509.             ON->Flags|=ON_FONT;
  510.           
  511.             ti[tagnum].ti_Tag  =SA_Font;
  512.             ti[tagnum].ti_Data =(ULONG)&ON->TA;
  513.             tagnum++;
  514.   
  515.             if(n->Flags & FIXASPECT && workdn.ModeID != -1)
  516.             {
  517.               if(GetDisplayInfoData(NULL,(UBYTE *)&dispinfo,sizeof(dispinfo),DTAG_DISP,workdn.ModeID))
  518.               {
  519.                 fonttags[0].ti_Data=(ULONG)dispinfo.Resolution.x|(((ULONG)dispinfo.Resolution.y)<<16);
  520.                 n->Font.tta_Style |= FSF_TAGGED;
  521.                 n->Font.tta_Tags   =fonttags;
  522.               }
  523.             }
  524.             CloneTextAttr(&n->Font,&ON->TA);
  525.   
  526.             n->Font.tta_Style &= (~FSF_TAGGED);
  527.             n->Font.tta_Tags=NULL;
  528.           }
  529.         }
  530.         break;
  531.     }
  532.  
  533.     if(n->PubOptions==1)
  534.     {
  535.       ULONG error=FALSE;
  536.       struct TagItem badtags[]=
  537.       {
  538.         SA_BitMap,    1<<0,
  539. //      SA_PubName,   1<<1,
  540.         SA_PubSig,    1<<2,
  541.         SA_PubTask,   1<<3,
  542.         SA_BackFill,  1<<4,
  543.         TAG_DONE,     0
  544.       };
  545.       
  546.       if(TagList) error =PackBoolTags(0,TagList,badtags);
  547.       if(ns)      error|=(ns->Type & CUSTOMBITMAP);
  548.       
  549.       if(error==0)
  550.       {
  551.         if(ON=AllocOpenNode(ON))
  552.         {
  553.           struct OpenNode *won;
  554.           UBYTE number[8];
  555.           ULONG cnt=1,len;
  556.           
  557.           strncpy(ON->PubName,n->PubName,MAXPUBSCREENNAME);
  558.           ON->PubName[MAXPUBSCREENNAME]=0;
  559.           len=strlen(ON->PubName);
  560.           len=min(len,MAXPUBSCREENNAME-9);
  561.           
  562.           won=(struct OpenNode *)MPSem->OpenList.lh_Head;
  563.           while(won->on_Node.ln_Succ)
  564.           {
  565.             if(cnt > 1)   
  566.             {
  567.               number[0]='.';
  568.               stci_d(&number[1],cnt);        
  569.               ON->PubName[len]=0;
  570.               strncat(ON->PubName,number,MAXPUBSCREENNAME);
  571.               ON->PubName[MAXPUBSCREENNAME]=0;
  572.             }
  573.             
  574.             if(0==strcmp(ON->PubName,won->PubName))
  575.             {
  576.               won=(struct OpenNode *)MPSem->OpenList.lh_Head;
  577.               cnt++;
  578.             }
  579.             else
  580.               won=(struct OpenNode *)won->on_Node.ln_Succ;
  581.           }
  582.           
  583.           ON->PubName[MAXPUBSCREENNAME]=0;
  584.           ON->Flags|=ON_PUBLIC|ON_OPEN;
  585.           
  586.           ti[tagnum].ti_Tag=SA_Title;
  587.           ti[tagnum].ti_Data=(ULONG)ON->PubName;
  588.           tagnum++;
  589.   
  590.           ti[tagnum].ti_Tag=SA_PubName;
  591.           ti[tagnum].ti_Data=(ULONG)ON->PubName;
  592.           tagnum++;
  593.       
  594.           ti[tagnum].ti_Tag=SA_PubSig;
  595.           ti[tagnum].ti_Data=PublicSignal;
  596.           tagnum++;
  597.           
  598.           ti[tagnum].ti_Tag=SA_PubTask;
  599.           ti[tagnum].ti_Data=(ULONG)MPTask;
  600.           tagnum++;
  601.           
  602.           
  603.           if(!(ON->Flags & ON_FONT))
  604.           {
  605.             struct TTextAttr *ot=NULL;
  606.             
  607.             if(ns)  ot=(struct TTextAttr *)ns->Font;          
  608.             ot=(struct TTextAttr *)GetTagData(SA_Font,(ULONG)ot,TagList);
  609.             
  610.             if(ot)
  611.             {
  612.               ON->Flags|=ON_FONT;
  613.   
  614.               CloneTextAttr(ot,&ON->TA);
  615.   
  616.               ti[tagnum].ti_Tag =SA_Font;
  617.               ti[tagnum].ti_Data=(ULONG)&ON->TA;
  618.               tagnum++;
  619.             }
  620.           }
  621.         }
  622.       }
  623.     }
  624.  
  625.   }/* end if !wbscr */
  626.   else  /* Yes, this is the Workbench screen */
  627.   {
  628.     if(ON=AllocOpenNode(ON))
  629.       ON->Flags|=ON_WORKBENCH;
  630.   }
  631.  
  632.   if(workdn.Look3D)
  633.   {
  634.     LONG dp;
  635.     
  636.     for(dp=0;dp<DRIPENS;dp++)
  637.       dripens[dp]=n->Pens[dp];
  638.     dripens[dp]=~0;
  639.     
  640.     ti[tagnum].ti_Tag=SA_Pens;
  641.     ti[tagnum].ti_Data=(ULONG)dripens;
  642.     tagnum++;
  643.   }
  644.  
  645.   if(workdn.AutoScroll)
  646.   {
  647.     ti[tagnum].ti_Tag=SA_AutoScroll;
  648.     ti[tagnum].ti_Data=TRUE;
  649.     tagnum++;
  650.   }
  651.  
  652.   
  653.   if(n->CenterFlags)
  654.   {    
  655.     if(GetDisplayInfoData(NULL,(UBYTE *)&diminfo,sizeof(struct DimensionInfo),DTAG_DIMS,workdn.ModeID))
  656.     {
  657.       if(n->CenterFlags & 1)
  658.       {
  659.         if(workdn.Width>-1)
  660.         {
  661.           ti[tagnum].ti_Tag=SA_Left;
  662.           ti[tagnum].ti_Data=((diminfo.StdOScan.MaxX-diminfo.StdOScan.MinX)-workdn.Width)/2;
  663.           tagnum++;
  664.         }
  665.       }
  666.       if(n->CenterFlags & 2)
  667.       {
  668.         if(workdn.Height>-1)
  669.         {
  670.           ti[tagnum].ti_Tag=SA_Top;
  671.           ti[tagnum].ti_Data=((diminfo.StdOScan.MaxY-diminfo.StdOScan.MinY)-workdn.Height)/2;
  672.           tagnum++;
  673.         }
  674.       }
  675.     }
  676.   }
  677.  
  678.   if(n->Flags & SCRHOTKEY)
  679.   {
  680.     if(ON=AllocOpenNode(ON))
  681.     {
  682.       if(ON->HotKey=AllocVec(strlen(n->HotKey)+1,MEMF_CLEAR|MEMF_PUBLIC))
  683.       {
  684.         strcpy(ON->HotKey,n->HotKey);
  685.         ON->Cx=AddHotKey(Broker,BrokerPort,ON->HotKey,(ULONG)ON);
  686.       }
  687.     }
  688.   }
  689.   
  690.  
  691.   if((workdn.Flags & INTERLEAVE) && !(custombm))
  692.   {
  693.     ti[tagnum].ti_Tag=SA_Interleaved;
  694.     ti[tagnum].ti_Data=TRUE;
  695.     tagnum++;
  696.   }
  697.   
  698.   ti[tagnum].ti_Tag=SA_MinimizeISG; /*** just a little extra for v40 ***/
  699.   ti[tagnum].ti_Data=TRUE;
  700.   tagnum++;
  701.  
  702.   if(TagList)
  703.   {
  704.     ti[tagnum].ti_Tag=TAG_MORE;
  705.     ti[tagnum].ti_Data=(ULONG)TagList;
  706.   }
  707.   else
  708.   {
  709.     ti[tagnum].ti_Tag=TAG_DONE;
  710.     ti[tagnum].ti_Data=0;
  711.   }
  712.  
  713.   /**** End Setup TagList ****/
  714.   
  715.   if(ON)
  716.   {
  717.     if(ON->Flags & ON_FONT)
  718.       textfont=OpenDiskFont((struct TextAttr *)&ON->TA);
  719.   }
  720. #ifdef ADD_DEBUG_CODE  
  721.   if(MPSem->Debug)
  722.   {
  723.     kprintf("  NewTags\n");
  724.     PrintTags(ti);
  725.     kprintf("..................................\n");
  726.     kprintf("Opening\n");
  727.   }
  728. #endif
  729.  
  730.   scr=OldOpenScreenTagList(ns,ti,IBase);
  731.  
  732. #ifdef ADD_DEBUG_CODE  
  733.   if(MPSem->Debug)
  734.   {
  735.     kprintf("Screen Addr %8lx\n",scr);
  736.   }
  737. #endif
  738.  
  739.   if(scr && n->Flags & SHAREPENS && n->LockedPens && V39)
  740.   {
  741.     UBYTE *str,state=0,done=FALSE;
  742.     WORD num=0,num1=0,num2;
  743.     struct ColorMap *cm;
  744.     
  745.     cm=scr->ViewPort.ColorMap;
  746.     
  747.     str=n->LockedPens;
  748.     
  749.     while(!done)
  750.     {
  751.       if(!*str) done=TRUE;
  752.       
  753.       if(*str>='0' && *str<='9')
  754.       {
  755.         if(state==0)
  756.           state=1;
  757.         num=0;
  758.         while(*str>='0' && *str<='9')
  759.         {
  760.           num*=10;
  761.           num+=*str - '0';
  762.           str++;
  763.         }
  764.         
  765.         switch(state)
  766.         {
  767.           case 1:
  768.        //     kprintf("obtaining %d\n",num);
  769.             ObtainPen(cm,num,0,0,0, PEN_EXCLUSIVE | PEN_NO_SETCOLOR);
  770.             break;
  771.           case 2:
  772.             for(num2=num1+1;num2<=num;num2++)
  773.             {
  774.          //     kprintf("obtaining %d\n",num2);
  775.               ObtainPen(cm,num2,0,0,0, PEN_EXCLUSIVE | PEN_NO_SETCOLOR);
  776.             }
  777.             break;
  778.         }
  779.         state=0;
  780.        
  781.       }
  782.       
  783.       if(*str==' ')
  784.         for(;*str==' ';str++);
  785.       else
  786.         if(*str=='-')
  787.         {
  788.           num1=num;
  789.           state=2;
  790.           str++;
  791.         }
  792.         else
  793.           str++;
  794.     }
  795.   }
  796.  
  797.  
  798.  
  799.   if(ON)
  800.   {
  801.     if(ON->Flags & ON_FONT)
  802.       if(textfont)
  803.         CloseFont(textfont);
  804.     
  805.     if(scr)
  806.     {
  807.       ON->Screen=scr;
  808.       if(ON->Flags & ON_PUBLIC)
  809.       {
  810.         if(n->PubOptions == 1)
  811.         {
  812.           PubScreenStatus(scr,0);
  813.         }
  814.       }
  815.       AddHead(&MPSem->OpenList,(struct Node *)ON);
  816.     }
  817.     else
  818.       FreeOpenNode(ON);
  819.   }
  820.   
  821. /*
  822.   if(scr)
  823.   {
  824.     VideoControlTags(scr->ViewPort.ColorMap,
  825.                       VTAG_BORDERSPRITE_SET,TRUE,
  826.                       TAG_DONE);
  827.   }
  828. */
  829.   if(ns) ns->Font=storedfont;
  830.  
  831.  
  832.   if(!scr) scr=OldOpenScreenTagList((struct ExtNewScreen *)ns,TagList,IBase);
  833.  
  834.   ReleaseSemaphore(&MPSem->ListSem);
  835.   ReleaseSemaphore(&MPSem->NodeSem);
  836.   return(scr);
  837. }
  838.  
  839. BOOL __saveds ASM NewCloseScreen(REG __a0 struct Screen *S,
  840.                                  REG __a6 struct IntuitionBase *IBase)
  841. {
  842.   struct OpenNode *on;
  843.   BOOL rv,ok=FALSE;
  844.   ULONG pub=0;
  845.  
  846. #ifdef ADD_DEBUG_CODE  
  847.   if(MPSem->Debug)
  848.   {
  849.     kprintf("--------------------------------\nCloseScreen(%8lx) -- %s\n",S,FindTask(0)->tc_Node.ln_Name);
  850.   }
  851. #endif
  852.  
  853.  
  854.   ObtainSemaphore(&MPSem->OpenListSem);
  855.   
  856.   on=(struct OpenNode *)MPSem->OpenList.lh_Head;
  857.   while(on->on_Node.ln_Succ)
  858.   {
  859.     if(on->Screen==S)
  860.     {
  861.       Remove((struct Node *)on);
  862.       pub=on->Flags & ON_PUBLIC;
  863.       ok=TRUE;
  864.       break;
  865.     }
  866.     on=(struct OpenNode *)on->on_Node.ln_Succ;
  867.   }
  868.   
  869.   if(!ok) on=NULL;
  870.   
  871.   if(!pub)
  872.   {
  873.     if(rv=OldCloseScreen(S,IBase))
  874.       FreeOpenNode(on);
  875.     else
  876.       if(on)
  877.         AddHead(&MPSem->OpenList,(struct Node *)on);  
  878.   }
  879.   else  // Public
  880.   {
  881.     on->Flags&=(~ON_OPEN);
  882.     S->DefaultTitle=S->Title=on->PubName;
  883.     ShowTitle(S,TRUE);
  884.     AddHead(&MPSem->OpenList,(struct Node *)on);
  885.     rv=TRUE;
  886.     Signal((struct Task *)MPTask,1<<PublicSignal);
  887.   }          
  888.   ReleaseSemaphore(&MPSem->OpenListSem);   
  889.  
  890. #ifdef ADD_DEBUG_CODE  
  891.   if(MPSem->Debug)
  892.   {
  893.     kprintf("  RV=%d\n",rv);
  894.   }
  895. #endif
  896.  
  897.  
  898.   return(rv);
  899. }
  900.  
  901. /*
  902. struct Screen *New LockPubScreen(REG STRPTR Name)
  903. {
  904.   struct Screen *scr;
  905.   
  906.   if(scr=LockPubScreen(Name))
  907.     return(scr);
  908.     
  909.   if(!(n=FindDNode(&MPSem->PromotionList[1],title)))
  910. */
  911.  
  912. LONG __saveds ASM NewCloseWorkBench(REG __a6 struct IntuitionBase *IBase)
  913. {   
  914.   LONG retval;
  915.   
  916. #ifdef ADD_DEBUG_CODE  
  917.   if(MPSem->Debug)
  918.   {
  919.     kprintf("--------------------------------\nCloseWorkBench() -- %s\n",FindTask(0)->tc_Node.ln_Name);
  920.   }
  921. #endif
  922.  
  923. //  ObtainSemaphore(&MPSem->OpenListSem);
  924.   
  925.   if(retval=OldCloseWorkBench(IBase))
  926.     FreeWBOpenNode();
  927.   
  928. //  ReleaseSemaphore(&MPSem->OpenListSem);
  929.  
  930. #ifdef ADD_DEBUG_CODE  
  931.   if(MPSem->Debug)
  932.   {
  933.     kprintf("  RV=%d\n",retval);
  934.   }
  935. #endif
  936.   return(retval);
  937. }
  938.   
  939. void FreeOpenNode(struct OpenNode *on)
  940. {
  941.  
  942. #ifdef ADD_DEBUG_CODE  
  943.   if(MPSem->Debug)
  944.   {
  945.     kprintf("--------------------------------\nFreeOpenNode(%8lx)\n",on);
  946.   }
  947. #endif
  948.  
  949.   
  950.   if(on) 
  951.   { 
  952.     /* All these are safe to call with NULL */
  953.     FreeVec(on->TA.tta_Name);
  954.     FreeVec(on->TA.tta_Tags);
  955.     DeleteCxObjAll(on->Cx);
  956.     FreeVec(on->HotKey);
  957.     if(V39)
  958.       FreeBitMap(on->BitMap);
  959.     FreeMem(on,sizeof(struct OpenNode));
  960.  
  961. #ifdef ADD_DEBUG_CODE  
  962.     if(MPSem->Debug)
  963.     {
  964.       kprintf("  Freed\n");
  965.     }
  966. #endif
  967.  
  968.  
  969.  
  970.   }
  971. }
  972.  
  973. void FreeWBOpenNode(void)
  974. {
  975.   struct OpenNode *on;
  976.  
  977. #ifdef ADD_DEBUG_CODE  
  978.   if(MPSem->Debug)
  979.   {
  980.     kprintf("--------------------------------\nFreeWBOpenNode()\n");
  981.   }
  982. #endif
  983.  
  984.   on=(struct OpenNode *)MPSem->OpenList.lh_Head;
  985.   while(on->on_Node.ln_Succ)
  986.   {
  987.     if((on->Flags & ON_WORKBENCH))
  988.     {
  989.       Remove((struct Node *)on);
  990.       FreeOpenNode(on);
  991.       return;
  992.     }
  993.     on=(struct OpenNode *)on->on_Node.ln_Succ;
  994.   }
  995. #ifdef ADD_DEBUG_CODE  
  996.   if(MPSem->Debug)
  997.   {
  998.     kprintf("  Not Freed\n");
  999.   }
  1000. #endif
  1001.  
  1002.   
  1003. }
  1004.  
  1005. void CatchDNode(ULONG Dest, UBYTE *Name, struct DefaultNode *SrcNode)
  1006. {
  1007.   struct DefaultNode *dnode;
  1008.   LONG l;
  1009.   
  1010.   if(dnode=AllocDefaultNode(Name))
  1011.   {
  1012.     dnode->Type         =Dest;
  1013.     dnode->Width        =SrcNode->Width;
  1014.     dnode->Height       =SrcNode->Height;
  1015.     dnode->AutoScroll   =SrcNode->AutoScroll;
  1016.     dnode->ModeSelect   =0;
  1017.     dnode->ModeID       =SrcNode->ModeID;
  1018.     dnode->OverscanType =SrcNode->OverscanType;
  1019.     dnode->Look3D       =SrcNode->Look3D;
  1020.     dnode->Flags        =SrcNode->Flags;
  1021.     dnode->Depth        =SrcNode->Depth;
  1022. /******* change to <= */
  1023.     for(l=0;l<DRIPENS;l++)
  1024.       dnode->Pens[l]      =SrcNode->Pens[l];
  1025.     
  1026.     PutMsg(CatchPort,(struct Message *)dnode);
  1027.   }
  1028.   return;
  1029. }
  1030.  
  1031. #ifdef ADD_DEBUG_CODE
  1032. #include <tagitemmacros.h>
  1033. void PrintTags(struct TagItem *tags)
  1034. {
  1035.   struct TagItem *tag,*tstate;
  1036.   
  1037.  
  1038.   ProcessTagList(tags,tag,tstate)
  1039.   {
  1040.     kprintf(FindTagSting(tag->ti_Tag),tag->ti_Data);
  1041.     kprintf("\n");
  1042.   }
  1043. }
  1044.  
  1045.  
  1046. ULONG TagID[]=
  1047. {
  1048.   SA_Left,
  1049.   SA_Top,
  1050.   SA_Width,
  1051.   SA_Height,
  1052.   SA_Depth,
  1053.   SA_DetailPen,
  1054.   SA_BlockPen,
  1055.   SA_Title,
  1056.   SA_Colors,
  1057.   SA_ErrorCode,
  1058.   SA_Font,
  1059.   SA_SysFont,
  1060.   SA_Type,
  1061.   SA_BitMap,
  1062.   SA_PubName,
  1063.   SA_PubSig,
  1064.   SA_PubTask,
  1065.   SA_DisplayID,
  1066.   SA_DClip,
  1067.   SA_Overscan,
  1068.   SA_Obsolete1,
  1069.   SA_ShowTitle,
  1070.   SA_Behind,
  1071.   SA_Quiet,
  1072.   SA_AutoScroll,
  1073.   SA_Pens,
  1074.   SA_FullPalette,
  1075.   SA_ColorMapEntries,
  1076.   SA_Parent,
  1077.   SA_Draggable,
  1078.   SA_Exclusive,
  1079.   SA_SharePens,
  1080.   SA_BackFill,
  1081.   SA_Interleaved,
  1082.   SA_Colors32,
  1083.   SA_VideoControl,
  1084.   SA_FrontChild,
  1085.   SA_BackChild,
  1086.   SA_LikeWorkbench,
  1087.   SA_Reserved,
  1088.   SA_MinimizeISG,
  1089.   0xffffffff,
  1090. };
  1091.  
  1092. UBYTE *TagStrings[]=
  1093. {
  1094.   "    SA_Left            %ld",
  1095.   "    SA_Top             %ld",
  1096.   "    SA_Width           %ld",
  1097.   "    SA_Height          %ld",
  1098.   "    SA_Depth           %ld",
  1099.   "    SA_DetailPen       %ld",
  1100.   "    SA_BlockPen        %ld",
  1101.   "    SA_Title           %s",
  1102.   "    SA_Colors          %lx",
  1103.   "    SA_ErrorCode       %lx",
  1104.   "    SA_Font            %lx",
  1105.   "    SA_SysFont         %ld",
  1106.   "    SA_Type            %lx",
  1107.   "    SA_BitMap          %lx",
  1108.   "    SA_PubName         %s",
  1109.   "    SA_PubSig          %lx",
  1110.   "    SA_PubTask         %lx",
  1111.   "    SA_DisplayID       %lx",
  1112.   "    SA_DClip           %lx",
  1113.   "    SA_Overscan        %ld",
  1114.   "    SA_Obsolete1       %ld",
  1115.   "    SA_ShowTitle       %ld",
  1116.   "    SA_Behind          %ld",
  1117.   "    SA_Quiet           %ld",
  1118.   "    SA_AutoScroll      %ld",
  1119.   "    SA_Pens            %lx",
  1120.   "    SA_FullPalette     %ld",
  1121.   "    SA_ColorMapEntries %ld",
  1122.   "    SA_Parent          %lx",
  1123.   "    SA_Draggable       %ld",
  1124.   "    SA_Exclusive       %ld",
  1125.   "    SA_SharePens       %ld",
  1126.   "    SA_BackFill        %lx",
  1127.   "    SA_Interleaved     %ld",
  1128.   "    SA_Colors32        %lx",
  1129.   "    SA_VideoControl    %lx",
  1130.   "    SA_FrontChild      %lx",
  1131.   "    SA_BackChild       %lx",
  1132.   "    SA_LikeWorkbench   %ld",
  1133.   "    SA_Reserved        %ld",
  1134.   "    SA_MinimizeISG     %ld",
  1135.   "Unknown Tag        %ld"
  1136. };
  1137.  
  1138. UBYTE *FindTagSting(ULONG id)
  1139. {
  1140.   ULONG l;
  1141.   
  1142.   for(l=0;;l++)
  1143.   {
  1144.     if(TagID[l]==id || TagID[l]==0xffffffff)
  1145.       return(TagStrings[l]);
  1146.   }
  1147.   return(TagStrings[l]);
  1148. }
  1149.  
  1150. void PrintDefNode(struct DefaultNode *DN)
  1151. {
  1152.   kprintf("DefaultNode(%8lx)\n Def_Node.ln_Name: %s\n",DN,DN->Def_Node.ln_Name);
  1153.   kprintf(" Type: %ld\n ModeSelect: %ld\n ModeID: %8lx\n Width: %ld Height: %ld\n"
  1154.          " OverscanType:%ld\n AutoScroll: %ld\n Look3D: %ld\n Flags: %8lx\n "
  1155.          "OrigDisplayID: %8lx\n",
  1156.          DN->Type,DN->ModeSelect,DN->ModeID,DN->Width,DN->Height,DN->OverscanType,
  1157.          DN->AutoScroll,DN->Look3D,DN->Flags,
  1158.          DN->OrigDisplayID);
  1159. }
  1160. #endif
  1161.  
  1162.  
  1163. void CloneTextAttr(struct TTextAttr *Source, struct TTextAttr *Dest)
  1164. {
  1165.   CopyMem(Source,Dest,sizeof(struct TextAttr));
  1166.     
  1167.   if(Dest->tta_Name=AllocVec(strlen(Source->tta_Name)+1,MEMF_CLEAR|MEMF_PUBLIC))
  1168.   {
  1169.     strcpy(Dest->tta_Name,Source->tta_Name);
  1170.     if(Dest->tta_Style & FSF_TAGGED)
  1171.     {
  1172.       if(!(Dest->tta_Tags=CloneTagItems(Source->tta_Tags)))
  1173.         Dest->tta_Style &= (~FSF_TAGGED);
  1174.     }
  1175.   }
  1176.   else
  1177.   {
  1178.     Dest->tta_Name=Topaz;
  1179.     Dest->tta_YSize=8;
  1180.     Dest->tta_Style=0;
  1181.     Dest->tta_Flags=0;
  1182.   }
  1183. }
  1184.  
  1185.  
  1186.